// 纯函数的使用：记忆函数
// 一个方法要调用很多次，每一次比较耗时，可以封装成纯函数把结果缓存起来
// 可缓存，可测试，可并行
const _ = require('lodash');

function getArea(r) {
  console.log('getArea 执行了==>');
  return Math.PI * r * r;
}

// 记忆函数根据输入的参数缓存了结果，这样多次调用的时候只执行了一次
// let getAreaWithMemory = _.memoize(getArea);
// console.log('==>', getAreaWithMemory(4));
// console.log('==>', getAreaWithMemory(4));
// console.log('==>', getAreaWithMemory(4));

function memoize(f) {
  const cache = {};
  return function () {
    const key = JSON.stringify(arguments);
    return cache[key] || (cache[key] = f.apply(f, arguments));
  };
}

let getAreaWithMemory = memoize(getArea);
console.log('==>', getAreaWithMemory(4));
console.log('==>', getAreaWithMemory(4));
console.log('==>', getAreaWithMemory(4));
